package lh.toolclass;

/**
 * 奇偶校验位算法
 */
public class CheckClass {
    /**
     * 偶校验位算法
     *
     * @param bytes
     * @return
     */
    public static byte getEvenCheckSite(byte[] bytes, int checkLength) {
        return getCheckSite(bytes, false, checkLength);
    }

    /**
     * 奇校验位算法
     *
     * @param bytes
     * @return
     */
    public static byte getOddCheckSite(byte[] bytes, int checkLength) {
        return getCheckSite(bytes, true, checkLength);
    }

    private static byte getCheckSite(byte[] bytes, boolean oddSign, int checkLength) {
        int count = 0;
        for (int i = 0; i < checkLength; i++) {
            count += getOneCount(bytes[i]);
        }
        if (oddSign)
            return (byte) (count % 2 == 1 ? 0 : 1);
        else
            return (byte) (count % 2 == 1 ? 1 : 0);
    }

    private static int getOneCount(byte v) {
        int count = 0;
        while (v != 0 && v != -1) {
            count += v & 0x01; //将v与00000001相与如果v的最后一位是1相与的结果是1，反之则是0。
            v >>= 1;    //右移一位。
//            v &= (byte) (v-1);   //v=v&(v-1)这个操作可以直接消除掉v中的最右边的1。
//            count++;
        }
        return count;
    }

}
